package com.cskaoyan.abstracts;

/*
            抽象类：包含有抽象方法的类或被abstract修饰的类

            抽象类和抽象方法必须用abstract关键字修饰
            abstract class 类名 {}
            public abstract void eat();  不包含方法体

            抽象类的特征：
            1. 抽象类不一定有抽象方法，有抽象方法的类一定是抽象类
            2. 抽象类的实例化特征:
               a. 抽象类不能直接实例化 （对象也叫做实例，创建对象也可以称之为实例化）
               b. 抽象类可以间接实例化
                  抽象类类型 引用变量 = new 抽象类子类对象();

            3. 子类特征, 抽象类的子类，两种情况:
                a. 抽象类的子类，还是抽象类
                b. 抽象类的子类，是普通的具体类(前提是，子类必须覆盖父类的所有抽象方法)
 */
public class Demo2Basic {

    public static void main(String[] args) {
        // 抽象类不能直接实例化
        //AbstractFather abstractFather = new AbstractFather();

        // 抽象类可以间接实例化
        AbstractFather father = new AbstractFirstSon();
        // 访问 abstractMethod()
        father.abstractMethod();

    }
}

// 包含抽象方法的类必须是抽象类
abstract class A {

    public abstract void test();
}

// 抽象类不一定包含抽象方法
abstract class B {}

abstract class AbstractFather {

    public abstract void abstractMethod();

    public void test() {
        System.out.println("test");
    }
}

// 抽象类的子类，可以是一个普通的具体类
class AbstractFirstSon extends AbstractFather {

    @Override
    public void abstractMethod() {
        System.out.println("abstractMethod");
    }
}

// 抽象类的子类，可以仍然是抽象类
abstract class AbstractSecondSon extends AbstractFather {

}
